Class文件

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,
中间没有添加任何分隔符号。Class文件采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只包含两种数据类型,
无符号数和表。无符号数属于基本的数据类型,以u1,u2,u4,u8分别代表1个字节,2个字节,4个字节和8个字节的无符号数,
可以用来描述数字、索引引用、数量值或者按照utf-8编码构成字符串值。表是由多个无符号数或者其他表作为数据项构成的
复合数据类型,所有表都习惯性地以“_info”结尾,用来描述有层次关系的复合结构数据。

Class文件的内容包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ClassFile {

u4 magic; //魔数:0xCAFEBABE,用来判断是否是Java class文件
u2 minor_version; //次版本号
u2 major_version; //主版本号
u2 constant_pool_count; //常量池大小
cp_info constant_pool[constant_pool_count-1]; //常量池
u2 access_flags; //类和接口层次的访问标志(通过|运算得到)
u2 this_class; //类索引(指向常量池中的类常量)
u2 super_class; //父类索引(指向常量池中的类常量)
u2 interfaces_count; //接口索引计数器
u2 interfaces[interfaces_count]; //接口索引集合
u2 fields_count; //字段数量计数器
field_info fields[fields_count]; //字段表集合
u2 methods_count; //方法数量计数器
method_info methods[methods_count]; //方法表集合
u2 attributes_count; //属性个数
attribute_info attributes[attributes_count]; //属性表

}
  • 访问标志:类还是接口;是否定义为public类型,abstract类型;若为类,是否声明为final。
  • 字段:用来描述接口或类中的变量,但不包括在方法内部的变量。
  • 字面量:文本字符串,声明为final的常量值等。
  • 符号引用:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符。
  • 类索引,父类索引,接口索引:用来确定类的继承关系。